package com.lock.type;

import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicInteger;

/**
 *  自旋锁
 *
 *  类似do while 循环，尝试去加锁，如果加锁成功就退出，每次成功就继续尝试加锁，线程不会睡眠，即不会产生线程上下文切换，同时由于不停的do while，会浪费cpu
 */
public class SpinningLockTest {

    private AtomicInteger num = new AtomicInteger(0);

    public int getNextValue(){

        // 这里就是在自旋
        while (true){

            // 获取工作内存中的值
            int tmp = num.get();
            // 拿工作内存中的值去主内存中对比，如果相同，则设置主内存中的值为 tmp + 1
            if (num.compareAndSet(tmp,tmp + 1)){

                return tmp + 1;
            }
        }
    }

    public static void main(String[] args) {


        SpinningLockTest spinningLockTest = new SpinningLockTest();




        for (int i = 0; i < 20; i++) {

            new Thread(()->{

                System.out.println(spinningLockTest.getNextValue());

            }).start();

        }


    }


}
